package com.javarush.test.level19.lesson10.bonus01;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/* Отслеживаем изменения
Считать в консоли 2 имени файла - file1, file2.
Файлы содержат строки, file2 является обновленной версией file1, часть строк совпадают.
Нужно создать объединенную версию строк, записать их в список lines
Операции ADDED и REMOVED не могут идти подряд, они всегда разделены SAME
Пример:
[Файл 1]
строка1
строка2
строка3

[Файл 2]
строка1
строка3
строка4

[Результат - список lines]
SAME строка1
REMOVED строка2
SAME строка3
ADDED строка4
*/

public class Solution {
    public static List<LineItem> lines = new ArrayList<LineItem>();


    public static void main(String[] args) throws IOException{

        List<String> same=new ArrayList<>();
        List<String> added=new ArrayList<>();
        List<String> removed=new ArrayList<>();

        List<String> file1=new ArrayList<>();
        List<String> file2=new ArrayList<>();
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        BufferedReader reader1=new BufferedReader(new FileReader("D:\\1.txt"));
        BufferedReader reader2=new BufferedReader(new FileReader("D:\\2.txt"));
        String str;
        while(!((str=reader1.readLine())==null)){
            file1.add(str);
        }
        while(!((str=reader2.readLine())==null)){
            file2.add(str);
        }
        reader.close(); reader1.close(); reader2.close();

        for(int i=0; i<file1.size();i++){
            if(file2.contains(file1.get(i))) same.add(file1.get(i));
              else  {
                removed.add(file1.get(i));
            }
        }

        for(int i=0; i<file2.size();i++){
            if (!file1.contains(file2.get(i))) added.add(file2.get(i));
        }

        int i=0;
        int si=0;


        if(removed.isEmpty()) {
            while (si < same.size() + 1) {

                try {
                    lines.add(new LineItem(Type.SAME, same.get(si)));
                } catch (IndexOutOfBoundsException e) {
                }


                try {
                    lines.add(new LineItem(Type.ADDED, added.get(i)));
                } catch (IndexOutOfBoundsException e) {
                }
                si++;
                i++;
            }
        }
        else if(!removed.isEmpty()&&!added.isEmpty())
            while(si<same.size()+1) {

            try{
            lines.add(new LineItem(Type.SAME, same.get(si)));}
            catch (IndexOutOfBoundsException e){}
            try{
                lines.add(new LineItem(Type.REMOVED, removed.get(i)));
            }catch(IndexOutOfBoundsException e){}

            try{
                lines.add(new LineItem(Type.SAME, same.get(si+1)));
            }catch(IndexOutOfBoundsException e){}

            try{
                lines.add(new LineItem(Type.ADDED, added.get(i)));
            }catch(IndexOutOfBoundsException e){}
            si=si+2;
            i++;
        }
        else if (added.isEmpty()){
        while(si<same.size()+1) {

            try {
                lines.add(new LineItem(Type.SAME, same.get(si)));
            } catch (IndexOutOfBoundsException e) {
            }
            try {
                lines.add(new LineItem(Type.REMOVED, removed.get(i)));
            } catch (IndexOutOfBoundsException e) {
            }


            si++;
            i++;
        }
        }

        for(LineItem l:lines){
            System.out.println(l.type+" "+l.line);
        }


    }




    public static enum Type {
        ADDED,        //добавлена новая строка
        REMOVED,      //удалена строка
        SAME          //без изменений
    }

    public static class LineItem {
        public Type type;
        public String line;

        public LineItem(Type type, String line) {
            this.type = type;
            this.line = line;
        }
    }
}
